package main

import (
	"fmt"
	"math/cmplx"
)

/*
========================基本类型有==================

bool

string

int  int8  int16  int32  int64
uint uint8 uint16 uint32 uint64 uintptr

int、uint 和 uintptr 类型在 32-位系统上通常为 32-位宽，在 64-位系统上则为 64-位宽。当你需要一个整数值时应使用 int 类型， 除非你有特殊的理由使用固定大小或无符号的整数类型。

byte // uint8 的别名

rune // int32 的别名
     // 表示一个 Unicode 码位

float32 float64

complex64 complex128

============================================================================*/

// var 语句可以出现在包或函数的层级。 没有明确初始化的变量声明会被赋予对应类型的 零值。0, (0.0), false, ""
var c, python, java bool

// 变量声明可以包含初始值，每个变量对应一个。 初始值在最后
var k, j int = 1, 2

// 变量声明也可以「分组」成一个代码块。 也可以声明在函数外的任何地方
var (
	ToBe   bool       = false
	MaxInt uint64     = 1<<64 - 1
	z      complex128 = cmplx.Sqrt(-5 + 12i)
)

// 类型转换
// 表达式 T(v) 将值 v 转换为类型 T。
// Go 在不同类型的项之间赋值时需要显式转换
var (
	iv int     = 42
	fv float64 = float64(iv)
	uv uint    = uint(fv)
)

func main() {
	/* ------------------------------------------------------------------------------------------------------------*/ println()
	var i int
	fmt.Println(i, c, python, java) // 0 false fals false
	/* ------------------------------------------------------------------------------------------------------------*/ println()
	// 如果提供了初始值，则类型可以省略；变量会从初始值中推断出类型。
	var ok, javaScripts = true, "Bad"
	fmt.Println(k, j, ok, javaScripts) // 1	2 true Bad
	/*-------------------------------------------------------------------------------------------------------------*/ println()
	// 在函数中，短赋值语句 := 可在隐式确定类型的 var 声明中使用。
	// * 函数外的每个语句都 必须 以关键字开始（var、func 等），因此 := 结构不能在函数外使用。
	yes := 222
	fmt.Println(yes) // 222
	/*-------------------------------------------------------------------------------------------------------------*/ println()
	fmt.Printf("类型：%T 值：%v\n", ToBe, ToBe)     //类型：bool 值：false
	fmt.Printf("类型：%T 值：%v\n", MaxInt, MaxInt) //类型：uint64 值：18446744073709551615
	fmt.Printf("类型：%T 值：%v\n", z, z)           // 类型：complex128 值：(2+3i)
	/*-------------------------------------------------------------------------------------------------------------*/ println()
	fmt.Printf("类型: %T 值: %v\n", iv, iv) // 类型: int 值: 42
	fmt.Printf("类型: %T 值: %v\n", fv, fv) // 类型: float64 值: 42
	fmt.Printf("类型: %T 值: %v\n", uv, uv) //类型: uint 值: 42
	/*-------------------------------------------------------------------------------------------------------------*/ println()
	// 当声明的右值确定了类型时，新变量的类型与其相同：
	var ic int
	jc := ic // jc 也是一个 int
	//不过当右边包含未指明类型的数值常量时，新变量的类型就可能是 int、float64 或 complex128 了，这取决于常量的精度：
	a := 2234           // int
	b := 3.1234         // float64
	c := 0.867 + 0.5i   // complex128
	fmt.Println(ic, jc) // 0 0
	fmt.Println(a)      // 2234
	fmt.Println(b)      // 3.1234
	fmt.Println(c)      //(0.867+0.5i)
	/*-------------------------------------------------------------------------------------------------------------*/ println()

}
